---
title: Docker的容器
sidebar_position: 2
---

镜像(Image) 和 容器(Container) 是 Docker 最基本的概念, 上一节已经简单介绍了一下镜像, 这一节再把容器的部分补上

Docker 的容器是运行时的一个实例, 其通过镜像创建, 两者之间的关系有点像 OOP 中的 `类` 和 `实例` 的关系, 容器可以被启动, 停止, 重启, 复制, 或者删除等操作

Docker 的容器看起来像是一个虚拟机, 但其本质上还是宿主机执行的一个进程, 只不过拥有独属于自己的命名空间, 可以视作和原来的环境是隔离的

Docker 的容器和镜像一样也是分层的, 相当于是将镜像作为基础层, 然后再之上加了一个数据层, 用于存储在容器运行过程中产生的数据以及其他杂七杂八的变更

## 创建容器

可以使用 `docker create` 命令创建容器, 其语法如下

```shell
docker create --name aname nginx:alpine
```

不过这种方式一般没啥人用, 因为一般都是通过 `docker run` 命令来创建容器, 其会自动创建并启动容器, 非常方便快捷省事

```shell
docker run --name aname nginx:alpine
```

按照以上命令创建并且启动容器之后可以看到nginx程序启动时的输出信息, 那些都是容器的输入内容

## 列出容器

在创建完容器之后我们可以通过 `ps` 命令来查看当前运行的容器

```shell
docker ps
```

```shell
CONTAINER ID   IMAGE             COMMAND      CREATED        STATUS      PORTS     NAMES
```

不过 `ps` 命令只能看到当前运行的容器, 如果没有只在运行的容器, 那就啥都看不到, 想要查看所有容器, 可以使用 `docker ps -a` 命令

```shell
docker ps -a
```

```shell
CONTAINER ID   IMAGE                       COMMAND                   CREATED         STATUS                      PORTS                    NAMES
6ba2202366f4   nginx:alpine                "/docker-entrypoint.…"   3 minutes ago   Exited (0) 2 minutes ago                             aname
```

这边可以看到, 我们刚才创建的容器 `aname` 已经存在了, 但是状态是已退出, 所以之前只是使用 `docker ps` 时无法查看到运行中的容器信息

## 启动已停止的镜像

上面我们可以看到 `aname` 容器状态已退出, 这时我们可以通过 `docker start` 命令来启动容器

```shell
docker start aname
docker ps
```

```shell
CONTAINER ID   IMAGE                       COMMAND                   CREATED        STATUS              PORTS     NAMES
6ba2202366f4   nginx:alpine                "/docker-entrypoint.…"   2 days ago     Up About a minute   80/tcp    aname
```

:::tip
其实也可以直接使用 `docker restart aname` 来重启容器, 效果是一样的, 而且在实际使用的时候 `restart` 可能会更加常用一点
:::

## 停止容器

可以通过 `docker stop` 命令来停止容器

```shell
docker stop aname
```

## 删除容器

当容器不再需要时, 可以通过 `docker rm` 命令来删除容器, 这个命令看起来和删除镜像很像, 不过 `rm` 命令是用来删除容器的, 而 `rmi` 命令是用来删除镜像的

```shell
docker rm aname
```

删除容器后会将容器在运行时生成的数据层也一起删除, 所以在删除容器之前最好先想清楚有没有需要保存下来的数据

